// 用于封装axios方便复用
import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Toast } from 'vant'
import JSONbigInt from 'json-bigint'

const baseURL = 'http://toutiao-app.itheima.net'
// const baseURL = 'http://localhost:8000'
const request = axios.create({
  baseURL,
  timeout: 10000,
  // `transformResponse` 在传递给 then/catch 前，允许修改响应数据
  transformResponse: [function(data) {
    // 对 data 进行任意转换处理
    // console.log(111111111, data)
    try {
      return JSONbigInt.parse(data)
    } catch (e) {
      return data
    }
  }]
})
// 添加请求拦截器
request.interceptors.request.use(function(config) {
  const token = store.state.user.token.token
  // 在发送请求之前做些什么
  if (token) {
    config.headers.Authorization = 'Bearer ' + token
  }
  return config
}, function(error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
request.interceptors.response.use(function(response) {
  // 对响应数据做点什么
  return response.data
}, async function(error) {
  // 对响应错误做点什么

  // 需求：如果每次请求返回都处理token失效错误的问题（麻烦）
  //       放到响应拦截器集中处理这个错误
  //       1.判断error的status是否为401
  //       2.跳转login 携带参数

  // 需求：无感刷新 (如果用户子啊填重要的表格时，token过期了会跳转，这是一个非常不友好的体验)
  // 1.如果token过期了，判断是否有refreshToken，
  //                   如果有用refreshToken发送请求获取新的token ，没有返回login
  //                   获取新的token成功则替换 vuex中的token 和refreshToken  再次刷新 获取用户信息  ，失败了  返回login页面
  console.log('响应拦截器', error)
  if (error.response.status === 401 && error.response.statusText === 'Unauthorized') {
    if (store.state.user.token.refresh_token) {
      try {
        // 在这里使用axios是因为 避免创建的实例request 请求拦截器加上过期的token
        const res = await axios({
          method: 'PUT',
          url: baseURL + '/v1_0/authorizations',
          headers: {
            Authorization: 'Bearer ' + store.state.user.token.refresh_token
          }
        })
        store.commit('user/setToken', {
          token: res.data.data.token,
          refresh_token: store.state.user.token.refresh_token
        })
        // return request(error.config)
        return request({
          method: error.config.method,
          url: error.config.url
        })
      } catch {
        store.commit('user/removeToken')
        router.push({
          path: '/login',
          query: {
            back: router.currentRoute.path
          }
        })
        Toast.fail('您的refresh_token已过期，已退出')
      }
    } else {
      store.commit('user/removeToken')
      router.push({
        path: '/login',
        query: {
          back: router.currentRoute.path
        }
      })
      Toast.fail('token已过期俩个小时，已退出')
    }
  } else {
    console.log('err')
    // 返回一个关于请求方面的错误
    return Promise.reject(error)
  }
})
export default request
